package main

import "fmt"

// 继续练习 11.2，在它中添加一个 gI() 函数，它不再接受 Simpler 类型的参数，而是接受一个空接口参数。
// 然后通过类型断言判断参数是否是 Simpler 类型。
// 最后在 main 使用 gI() 取代 fI() 函数并调用它。确保你的代码足够安全。

type Any interface{}

type Simpler interface {
	Get() int
	Set(int)
}

type Simple struct {
	int
	getCount int
	setCount int
}

func (s *Simple) Get() int {
	s.getCount++
	return s.int
}

func (s *Simple) Set(d int) {
	s.int = d
	s.setCount++
}

type RSimple struct {
	i, j int
}

func (r *RSimple) Get() int {
	return r.j
}

func (r *RSimple) Set(d int) {
	r.i, r.j = r.j, d
}

func gI(any Any) {
	if v, ok := any.(*Simple); ok {
		fmt.Println("Simple get call count: ", v.getCount)
	} else {
		fmt.Printf("not simple: %T\n", any)
	}
}

func main() {
	s := new(Simple)
	s.Set(55)
	fmt.Println("simple get(): ", s.Get())
	gI(s)
	rs := RSimple{0, 1}
	rs.Set(10)
	gI(rs)
}
